package com.example.mapdata.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Slf4j
@Component // 将当前类交给ioc容器管理
@Aspect // AOP类
public class TimeAspect {

    /**
     * 定义切入点表达式
     */
    @Pointcut("execution(* com.example.mapdata.controller.*.*(..))")
    private void pointcut() {

    }

    // 切入点表达式
    @Around("pointcut()")
    public Object recordTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 1.记录方法执行时间
        long begin = System.currentTimeMillis();

        // 2.调用原始方法时间
        Object proceed = proceedingJoinPoint.proceed();

        // 3.记录方法结束时间
        long end = System.currentTimeMillis();
        log.info(proceedingJoinPoint.getSignature() + "方法执行时间: {}ms", end - begin);

        // 4.返回结果
        return proceed;
    }

    @Before("pointcut()")
    public void before() {
        log.info("before...");
    }
}
